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; }