合并两个有序链表错误点

合并两个有序链表错误点

Tags
算法
错误整理
description
更新时间
Last updated January 26, 2022
 
 
notion image

版本1

 
/* * @lc app=leetcode.cn id=21 lang=javascript * * [21] 合并两个有序链表 */ // @lc code=start /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function (l1, l2) { const head = new ListNode(0, null); let p = head; while (l1 && l2) { const tmp = new ListNode(0, null); if (l1.val > l2.val) { tmp.val = l2.val; l2 = l2.next; } else { tmp.val = l1.val; l1 = l1.next; } p.next = tmp; p = p.next; } while (l1) { const tmp = new ListNode(0, null); tmp.val = l1.val; p.next = tmp; l1 = l1.next; p = p.next; } while (l2) { const tmp = new ListNode(0, null); tmp.val = l2.val; p.next = tmp; l2 = l2.next; p = p.next; } return head.next; }; // @lc code=end
在版本1中,我们每次找到一个较小值都创建一个新的节点去获取val,实际上并没有必要,直接等于现有的节点,然后将节点断开连接
 

版本2

 
/* * @lc app=leetcode.cn id=21 lang=javascript * * [21] 合并两个有序链表 */ // @lc code=start /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function (l1, l2) { const head = new ListNode(0, null); let p = head; while (l1 && l2) { if (l1.val > l2.val) { p.next = l2; l2 = l2.next; } else { p.next = l1; l1 = l1.next; } p = p.next; } while (l1) { p.next = l1; l1 = l1.next; p = p.next; } while (l2) { p.next = l2; l2 = l2.next; p = p.next; } return head.next; }; // @lc code=end
对于第一个while循环之后,判断l1,l2是否有剩余的这部分逻辑里,应当注意的是l1或者l2已经是有序排列的链表了,不需要再进行节点next的比较或者赋值,只需要让尾节点等于剩余部分的头节点就行了
 

最终版本

 
/* * @lc app=leetcode.cn id=21 lang=javascript * * [21] 合并两个有序链表 */ // @lc code=start /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function (l1, l2) { const head = new ListNode(0, null); let p = head; while (l1 && l2) { if (l1.val > l2.val) { p.next = l2; l2 = l2.next; } else { p.next = l1; l1 = l1.next; } p = p.next; } if (l1) { p.next = l1; } if (l2) { p.next = l2; } return head.next; }; // @lc code=end