/**
* 单链表奇数递增偶数递减,使之升序
* 分三步:
* 1.拆分成2个链表
* 2.对逆序的链表反转
* 3.合并2个链表
*/
public class SortedOddAndEvenList {
public static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
// 这一步注意细节
public static ListNode[] getTwoList(ListNode head) {
if (head == null || head.next == null) return null;
ListNode l1 = head;
ListNode l2 = head.next;
ListNode next = null;
ListNode copyNode = null;
while (l1 != null) {
next = l1.next.next;
copyNode = l1.next;
l1.next = next;
copyNode.next = next == null ? null : next.next;
l1 = next;
}
return new ListNode[]{head, l2};
}
public static ListNode reverse(ListNode head) {
ListNode pre = null, next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
public static ListNode mergeListNode(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
p.next = l1;
l1 = l1.next;
} else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
if (l1 != null) p.next = l1;
if (l2 != null) p.next = l2;
return dummy.next;
}
public static void main(String[] args) {
ListNode head = new ListNode(0);
head.next = new ListNode(9);
head.next.next = new ListNode(2);
head.next.next.next = new ListNode(8);
ListNode[] twoList = getTwoList(head);
if (twoList == null) {
return;
}
ListNode l1 = twoList[0];
ListNode l2 = reverse(twoList[1]);
ListNode res = mergeListNode(l1, l2);
while (res != null) {
System.out.println(res.val);
res = res.next;
}
}
}
单链表奇数递增偶数递减,使之升序
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1二进制中1的个数 【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 【考察点】位运算 【...
- 去面试问了单链表实现快排的问题,所以想来把八大排序算法的单链表实现总结一下。 这篇就先总结直接插入排序。实际上,算...