合并链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。
示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
思路:比较当前两个元素大小,小的添入链表。循环进行,直至链表为空
注意⚠️:处理链表的本质,是处理链表结点之间的指针关系。
/*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/const mergeTwoLists = function(l1, l2) {// 定义头结点,确保链表可以被访问到let head = new ListNode()// cur 这里就是咱们那根“针”let cur = head// “针”开始在 l1 和 l2 间穿梭了while(l1 && l2) {// 如果 l1 的结点值较小if(l1.val<=l2.val) {// 先串起 l1 的结点cur.next = l1// l1 指针向前一步l1 = l1.next} else {// l2 较小时,串起 l2 结点cur.next = l2// l2 向前一步l2 = l2.next}// “针”在串起一个结点后,也会往前一步cur = cur.next}// 处理链表不等长的情况cur.next = l1!==null?l1:l2// 返回起始结点return head.next};
链表节点的删除
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1: 输入: 1->1->2 输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
注意⚠️:链表的遍历用while
/*** @param {ListNode} head* @return {ListNode}*/const deleteDuplicates = function(head) {// 设定 cur 指针,初始位置为链表第一个结点let cur = head;// 遍历链表while(cur != null && cur.next != null) {// 若当前结点和它后面一个结点值相等(重复)if(cur.val === cur.next.val) {// 删除靠后的那个结点(去重)cur.next = cur.next.next;} else {// 若不重复,继续遍历cur = cur.next;}}return head;};
链表反转
function reverse(nodeLst){var pNode = nodeLst;var pPre = null; //翻转之后 第一个节点的next值 为 nullvar pNext;while(pNode) {pNext = pNode.next; //获取到当前节点的下一个节点pNode.next = pPre; //当前节点的前一个指向上一个节点pPre = pNode; //上一个节点赋值为当前节点pNode = pNext; //当前节点赋值为下一个节点}return pPre;}
