排序奇升偶降链表

994 阅读1分钟

题目

image.png

思路

  • 分离奇偶节点
  • 偶链表反转
  • 合并两个有序链表

代码

  • 边界情况:在分离奇偶节点时,当节点数为偶数个时,倒数第二节点.next会指向倒数第一节点,但需要指向null。节点数为奇数个没事

6BC87A5F447A4701B904890A6CFECE0B.png

class ReorderList {
	// ListNode类
	public static class ListNode {
		public int val;
		public ListNode next;
		public ListNode() {}
		public ListNode(int val) {
			this.val = val;
		}
	}
	// 重排
	public static ListNode reorderList(ListNode head) {
		//分离链表
		ListNode evenHead = head.next;
		ListNode cur1 = head;
		ListNode cur2 = evenHead;
		while (cur1.next != null && cur2.next != null) {
			cur1.next = cur1.next.next;
			cur2.next = cur2.next.next;
			cur1 = cur1.next;
			cur2 = cur2.next;

		}
		cur1.next = null;
		cur2.next = null;
		return mergeTwoList(head, reverseList(evenHead));

	}
	//合并两个有序链表
	public static ListNode mergeTwoList(ListNode node1, ListNode node2) {
		ListNode dummy = new ListNode();
		ListNode cur = dummy;
		while (node1 != null && node2 != null) {
			if (node1.val < node2.val) {
				cur.next = node1;
				node1 = node1.next;

			} else {
				cur.next = node2;
				node2 = node2.next;
			}
			cur = cur.next;
		}
		if (node1 != null) {
			cur.next = node1;
		}
		if (node2 != null) {
			cur.next = node2;
		}
		return dummy.next;
	}
	// 反转链表
	public static ListNode reverseList(ListNode head) {
		ListNode pre = null;
		ListNode cur = head;
		while (cur != null) {
			ListNode tmp = cur.next;
			cur.next = pre;
			pre = cur;
			cur = tmp;
		}
		return pre;
	}
	// 打印链表
	public static void printList(ListNode head) {
		ListNode cur = head;
		while (cur != null) {
			System.out.print(cur.val + "->");
			cur = cur.next;
		}
		System.out.println("Null");
	}
	// 构建链表
	public static ListNode buildList(int[] nums) {
		ListNode dummy = new ListNode();
		ListNode cur = dummy;
		for (int i = 0; i < nums.length; i++ ) {
			cur.next = new ListNode(nums[i]);
			cur = cur.next;
		}
		return dummy.next;
	}

	public static void main(String[] args) {
		int[] nums = new int[]{1,8,3,6,5,4,7,2,9,0};
		ListNode head = buildList(nums);
		ListNode res = reorderList(head);
		printList(res);
		
	}

}