字节笔试之奇偶链表升序

48 阅读1分钟

题目

list奇数位升序,偶数位降序,让链表变成升序的。
比如: 1->3->4->2调整为1->2->3->4

思路

这是一道非常好的锻炼链表基本操作的题目,要充分利用好奇偶各自有序的特性,链表拆分,链表转置,链表归并

show me your code

public static ListNode sortLinkedList(ListNode head) {
   // 拆分
   ListNode[] divided = divide(head);
   ListNode jHead = divided[0];
   ListNode oHead = divided[1];
   // 链表倒置
   ListNode reversedONode = reverse(oHead.next);
   // 双指针合并
   return merge(reversedONode, jHead.next);
}

public static ListNode[] divide(ListNode head) {// 拆分
   ListNode jHead = new ListNode();
   ListNode oHead = new ListNode();
   int i = 1;
   ListNode jCur = jHead;
   ListNode oCur = oHead;
   while (head != null) {
      // 偶
      if (i % 2 == 0) {
         oCur.next = head;
         oCur = oCur.next;
      } else {// 奇
         jCur.next = head;
         jCur = jCur.next;
      }
      head = head.next;
      i++;
   }
   // 收尾
   jCur.next = null;
   oCur.next = null;
   return new ListNode[]{jHead, oHead};
}

public static ListNode reverse(ListNode head) { // 倒置
   ListNode preNode = null;
   while (head != null) {
      ListNode curNextNode = head.next;
      head.next = preNode;
      preNode = head;
      head = curNextNode;
   }
   return preNode;
}

public static ListNode merge(ListNode leftHead, ListNode rightHead) { // 归并
   ListNode result = new ListNode();
   ListNode resultCur = result;
   while (leftHead != null && rightHead != null) {
      if (leftHead.val < rightHead.val) {
         resultCur.next = leftHead;
         leftHead = leftHead.next;
      } else {
         resultCur.next = rightHead;
         rightHead = rightHead.next;
      }
      resultCur = resultCur.next;
   }
   if (leftHead != null) {
      resultCur.next = leftHead;
   }
   if (rightHead != null) {
      resultCur.next = rightHead;
   }
   return result.next;
}