【题目】给定两个有序单链表的头节点head1和head2,请合并两个有序链表,合并后的链表也必须有序,并返回合并后链表的头节点
【要求】 假设两个链表的长度分别为M,N,要求时间复杂度为O(M+N),额外空间复杂度O(1);
【解题步骤】
- (1)若两个链表有一个为空,则无需合并,返回另一个链表的头节点
- (2)比较head1和head2的值,小的节点也是合并后链表的最小节点,它是合并后链表的头节点,记为head
- (3)假设head所在的链表为head1,,另一个链表为head2,两个链表都从头开始遍历,比较每次遍历的两个节点的值记为cur1,cur2,然后根据大小关系进行调整。并用变量pre表示上次比较时比较小的节点;
- (4)若链表1先走完,那就把链表2剩下的部分拼接到pre的后面,即pre->next 指向 cur2;若链表2先走完,说明链表2的所有节点都已经插入到链表1中,调整结束
【举例】
链表1:1->5->6->NULL
链表2:2->3->7->NULL
- 令cur1 = 1;cur2 = 2;pre = NULL;cur1小于cur2,cur1不做调整,令pre = cur1 = 1;继续遍历cur1的下一个节点即cur1 = 5;
- cur1 = 5;cur2 = 2;pre1 = 1;cur2小于cur1,让pre->next 指向 cur2,cur2的指针指向cur1,这样cur2便插入到cur1中。pre = cur2 = 2;继续遍历下一节点cur2 = 3;此时链表1变为1->2->3->5->6->NULL;链表2变为3->7->NULL;cur1 = 5,cur2 = 3,