LeetCode T21.Merge Two Sorted Lists/合并两个有序链表

 

 本题中给定两个有序链表让我们进行重新连接,这里我们可以将其看作对两条链表重组的过程,而由于是有序链表,其连接必定是从左向右进行,我们设定两个指针,一个指针做头节点,另一个用来做追踪最小元素,在两个链表的遍历过程中先一一对比,较小的元素处链表指针后移一位,追踪指针指向该较小的节点,另一条链表的链表指针不动,与后移后的新一个节点进行对比,若小于该节点,则同样后移,追踪指针更新指向位置,另一个链表指针位置不变。这样最终只是一个包含两个链表的循环,时间复杂度为O(m+n),而运行过程中变量个数为常数,因此空间复杂度为O(1)。

我的题解代码如下,leetcode上运行时间4ms,内存占用5.6MB

struct ListNode{
    int val;
    struct ListNode *next;
};

struct ListNode *mergeTwoLists(struct ListNode *l1,struct ListNode *l2){
    struct ListNode *head=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode *add=head;
    struct ListNode *p=l1,*q=l2;
    while(p && q){
        if(p->val<=q->val){
            add->next=p;
            add=add->next;
            p=p->next;
        }
        else{
            add->next=q;
            add=add->next;
            q=q->next;
        }
    }
    if(!p && q) add->next=q;
    else add->next=p;
    return head->next;
}

 

posted @ 2020-05-01 16:50  runsdeep  阅读(174)  评论(0编辑  收藏  举报