1.合并两个有序链表

https://leetcode-cn.com/problems/merge-two-sorted-lists/
递归

迭代

  1. var mergeTwoLists = function(l1, l2) {
  2. const a = new ListNode(0)
  3. let preNode = a
  4. while (l1 && l2) {
  5. if (l1.val < l2.val) {
  6. preNode.next = l1
  7. l1 = l1.next
  8. } else {
  9. preNode.next = l2
  10. l2 = l2.next
  11. }
  12. preNode = preNode.next
  13. }
  14. preNode.next = l1 ? l1 : l2
  15. return a.next
  16. }

2、删除排序链表中的重复元素

3、合并k个排序链表

分治法

  1. var mergeKLists = function (lists) {
  2. /* 分而治之 */
  3. if (lists.length <= 1) return lists[0] || null;
  4. const newLists = [];
  5. for (let i = 0; i < lists.length; i += 2) {
  6. newLists.push(merge(lists[i], lists[i + 1]));
  7. }
  8. return mergeKLists(newLists);
  9. };

4、判断链表是否有环

https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-kuai-man-zhi-zhen-by-zf1b/
image.png

5、环形链表2 返回入环点的索引 done

  1. var detectCycle = function(head) {
  2. let fast = head
  3. let slow = head
  4. let flag = 0
  5. while(fast && fast.next) {
  6. fast = fast.next.next
  7. slow = slow.next
  8. if (slow == fast) {
  9. flag = 1
  10. break
  11. }
  12. }
  13. if (flag == 0) return null
  14. //注意,将fast移动到head部位,再次循环
  15. fast = head
  16. while (fast && slow) {
  17. if (fast == slow) {
  18. return fast
  19. }
  20. fast = fast.next
  21. slow = slow.next
  22. }
  23. };

5、反转链表

  1. var reverseList = function(head) {
  2. let node = head
  3. let preNode = null
  4. let temp = null
  5. while (node) {
  6. //注意
  7. temp = node.next
  8. node.next = preNode
  9. preNode = node
  10. node = temp
  11. }
  12. return preNode
  13. };