输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
这个合并链表的思路其实不难,就是遍历两个链表,只有两个都为空的时候才遍历完成,每次都比较l1和l2当前节点的大小,小的那个就直接存入新链表就行,直到遍历完成,返回新链表
思路就是那样,关键是看你怎么去写,刚开始想了很多以为很难写,其实写起来不是那么难,因为链表的遍历是你可以控制的,如果是for循环,每次都得强制向前走一步
需要注意的是,你怎么遍历链表,怎么往新链表中插入节点
还有遍历到其中一个链表为空之后,只需要再遍历完另外一个链表即可
还有刚开始有一个初始头节点,并把初始头节点赋值给pre了,如果直接用cur初始头节点遍历,那么最后cur存储的就是新链表的最后一个节点了,是为了保持它是头节点,最后返回cur->next就行了
这样的思路时间复杂度是O(m+n)
贴出代码:
class Solution {
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
function mergeTwoLists($l1, $l2) {
//l1为空,合并就直接返回l2就行
if ($l1 == null) {
return $l2;
}
if ($l2 == null) {
return $l1;
}
$cur = new ListNode();
$pre = $cur;
while ($l1 != null || $l2 != null) {
//当l1为空之后,只遍历l2就行了
if ($l1 == null) {
$pre->next = $l2;
$pre = $l2;
$l2 = $l2->next;
continue;
}
//当l2为空之后,只遍历l1就行了
if ($l2 == null) {
$pre->next = $l1;
$pre = $l1;
$l1 = $l1->next;
continue;
}
if ($l1->val < $l2->val) {
$pre->next = $l1;//将l1指针放进新链表里面
$pre = $l1;//将pre变为新链表最后一个节点
$l1 = $l1->next;//用来遍历l1链表
} else {
$pre->next = $l2;
$pre = $l2;
$l2 = $l2->next;
}
}
return $cur->next;
}
}