【链表】合并两个有序链表

算法思路:

  1. 创建两个指针pa和pb,分别指向两个结点的首元结点。创建一个空结点c,再创建一个指针pc指向c结点。c结点将作为我们有序结点的头结点。因为pc指针会改变,我们再创建一个head指针指向pc,最后返回head→next
  2. 进行while循环,条件为pa和pb同时存在
  3. 如果pa指向结点小于等于pb指向结点,将pc→next指向pa所指向的结点指针域中的下一个结点。对pb也是一样。然后将pa的地址赋给pc,pa后移一位
  4. 如果退出循环,判断pa和pb两个其中是否还有不为空,若是,则把剩余的元素接入链表(pc→next = aa或pc→next = pb)
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* pa = l1;
    struct ListNode* pb = l2;
    struct ListNode c = {0,l1};
    struct ListNode* pc = &c;
    struct ListNode* head = pc;
    
    while(pa&&pb) {
        if(pa->val <= pb->val) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa ? pa:pb;

    return head->next;
}