6月22日算法日记

147 阅读2分钟

1.合并两个有序链表

image-20220622214620147

解法

1.循环+双指针

首先新建一个空结点resultNode,然后让p指向resultNode

使用双指针每次比对两链表的两个结点,首先判断两链表其中一个链表是否为空,如果为空就跳出循环。接下来如果list1.val < list2.val,那么p.next = list1且list1就顺移到下一个结点即list1 = list1.next,同理list1.val >= list2.val的情况也是如此。

直到有某一链表被循环完毕了,则跳出循环进行判断。如果list1为空了,那么p.next = list2 ,因为list2本就是有序的。所以可以直接将list2的所有结点连接在p后面;同理list2为空也是这样的逻辑。

最后只需要将resultNode.next返回即可,因为resultNode的头结点是我自定义为0不需要带着返回

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
  let resultNode = new ListNode(0, null)
  let p = resultNode
  if(list1 == null) return list2
  if(list2 == null) return list1
  while(list1 != null && list2 != null) {
      if(list1.val < list2.val) {
          p.next = list1
          list1 = list1.next
      } else {
          p.next = list2
          list2 = list2.next
      }
      p = p.next
  }
  if(list1 == null) {
      p.next = list2
  }
  if(list2 == null) {
      p.next = list1
  }
  return resultNode.next
};

其中的关键点就是,我认为resultNode是一个完整的链表,而p只是该链表中的某一个结点,所以不可以省略以下这一步,如果最后返回p或者p.next的话得到的只是一个结点而非链表。

let resultNode = new ListNode(0, null)
let p = resultNode

2.递归

var mergeTwoLists = function(list1, list2) {
  if(list1 == null) return list2
  if(list2 == null) return list1
  if(list1.val < list2.val) {
      list1.next = mergeTwoLists(list1.next,list2)
      return list1
  } else {
      list2.next = mergeTwoLists(list1,list2.next)
      return list2
  }
};

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

image-20220623000532282

解法

1.普通解法

判断下一个结点是否为空,如果不为空的话,那么就比较当前结点和下一个结点的值;如果这两者相等的话就将currentNode.next.next赋给currentNode.next将该重复元素覆盖掉,反之就将当前结点变为下一结点。

var deleteDuplicates = function(head) {
    //空链表
    if(head == null) {
        return head
    }
    //这里一定要注意,currentNode最终只是结点,只有head才是完整的链表
    let currentNode = head
    //只有下一结点不为空才可以进入循环
    while(currentNode.next != null) {
        if(currentNode.val == currentNode.next.val) {
            currentNode.next = currentNode.next.next
        } else {
            currentNode = currentNode.next
        }
    }
    return head
};